# -*- coding: utf-8 -*-
"""
文章模型
目的：定义文章数据结构，映射数据库articles表
职责：管理文章的属性和数据库交互，提供文章对象的序列化方法
"""
from sqlalchemy import Column, Integer, String, Text, TIMESTAMP, SmallInteger, DECIMAL, DateTime
from sqlalchemy.sql import func
from app.models.user import Base


class Article(Base):
    """
    文章数据模型类
    目的：表示博客系统中的文章实体，存储文章的所有相关信息
    职责：定义文章字段、提供数据验证和序列化功能
    使用场景：文章发布、编辑、查询等所有文章相关操作
    """
    __tablename__ = 'articles'

    # 主键字段，文章的唯一标识符
    id = Column(Integer, primary_key=True, autoincrement=True, comment='文章唯一标识符')

    # 文章基本信息字段
    title = Column(String(255), nullable=False, comment='文章标题')
    content = Column(Text, nullable=False, comment='文章内容（支持HTML/Markdown）')
    summary = Column(Text, nullable=True, comment='文章摘要')

    # 关联字段
    author_id = Column(Integer, nullable=False, comment='作者用户ID，外键关联users表')
    category_id = Column(Integer, nullable=True, comment='分类ID，外键关联categories表')
    location_id = Column(Integer, nullable=True, comment='定位信息ID，外键关联locations表')

    # 文章元数据字段
    cover_image = Column(String(255), nullable=True, comment='文章封面图片路径')
    tags = Column(String(500), nullable=True, comment='文章标签，逗号分隔')

    # 统计字段
    view_count = Column(Integer, nullable=False, default=0, comment='浏览次数')
    like_count = Column(Integer, nullable=False, default=0, comment='点赞数')
    comment_count = Column(Integer, nullable=False, default=0, comment='评论数量')

    # 状态字段
    status = Column(SmallInteger, nullable=False, default=1, comment='文章状态：0-草稿，1-已发布，2-下线')
    is_top = Column(SmallInteger, nullable=False, default=0, comment='是否置顶：0-否，1-是')

    # 时间字段 - 使用DATETIME避免时区转换问题
    published_at = Column(DateTime, nullable=True, comment='发布时间')
    created_at = Column(DateTime, nullable=False, default=func.now(), comment='创建时间')
    updated_at = Column(DateTime, nullable=False, default=func.now(),
                       onupdate=func.now(), comment='更新时间')

    def to_dict(self, include_content=True):
        """
        将文章对象转换为字典格式
        目的：提供文章数据的序列化方法，用于API响应
        功能：将SQLAlchemy模型对象转换为可JSON序列化的字典

        Args:
            include_content (bool): 是否包含文章内容，列表查询时可设为False以减少数据量

        Returns:
            dict: 包含文章所有字段的字典，时间字段转换为ISO格式字符串
        """
        # 基础字典结构，包含文章的所有字段信息
        result = {
            'id': self.id,
            'title': self.title,
            'summary': self.summary,
            'author_id': self.author_id,
            'category_id': self.category_id,
            'location_id': self.location_id,
            'cover_image': self.cover_image,
            'tags': self.tags.split(',') if self.tags else [],  # 将逗号分隔的标签字符串转换为列表
            'view_count': self.view_count,
            'like_count': self.like_count,
            'comment_count': self.comment_count,
            'status': self.status,
            'is_top': self.is_top,
            'published_at': self.published_at.isoformat() if self.published_at else None,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }

        # 根据参数决定是否包含文章完整内容，列表接口可以不返回内容以提升性能
        if include_content:
            result['content'] = self.content

        return result
